package main

import "fmt"

// 定义动物的结构体
type Animal struct {
	age    int
	weight float32
}
// 给Animal绑定方法:喊叫
func (an *Animal) Shout() {
	fmt.Println("大声喊叫")
}
// 给Animal绑定方法:展示自我信息
func (an *Animal) ShowInfo() {
	fmt.Printf("动物的年龄:%v,体重:%v", an.age, an.weight)
	fmt.Println()
}

// 定义结构体:Cat
type Cat struct {
	// 为了复用性,体现继承思维,加入匿名结构体
	Animal
	Age int
}
// 给猫也绑定一个方法:展示自我信息
func (c *Cat) ShowInfo() {
	fmt.Printf("~~~~~~~~动物的年龄:%v,体重:%v", c.age, c.weight)
	fmt.Println()
}
// 对Cat绑定特有方法:挠人
func (c *Cat) scratch() {
	fmt.Println("我是胖虎,我要挠人")
}

func main() {
	// 创建Cat结构体
	cat := &Cat{}
	// cat结构体具有了Animal的属性
	cat.age = 3
	cat.weight = 13.5
	// 调用继承的方法
	cat.Shout()    // 打印:大声喊叫
	// 可以发现调用的是Cat结构体绑定的方法,不是Animal结构体绑定的方法
	cat.ShowInfo() // 打印:~~~~~~~~动物的年龄:3,体重:13.5
	// 调用cat自己的方法
	cat.scratch() // 打印:我是胖虎,我要挠人

	// 如果要调用Animal结构体绑定的方法,通过匿名结构体的名指引一下
	cat.Animal.age = 5
	cat.Animal.ShowInfo()	// 打印:动物的年龄:5,体重:13.5
}
